Code coverage report for src/index.js

Statements: 33.33% (45 / 135)      Branches: 8.08% (8 / 99)      Functions: 50% (9 / 18)      Lines: 31.25% (40 / 128)      Ignored: none     

All files » src/ » index.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 2701     1   1   2   1       1                   1       1   1   2         1     1     1     1         1   1 1 2   2   2 2 2 2   2 2 2       1   1         1 10   10                       10     1                                                                                                                       1             1                                             1           1                                                                                                                                       1       1     1        
System.register(['core-js', 'aurelia-history'], function (_export) {
  'use strict';
 
  var core, History, routeStripper, rootStripper, isExplorer, trailingSlash, absoluteUrl, BrowserHistory;
 
  _export('configure', configure);
 
  function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
  function _inherits(subClass, superClass) { Iif (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); Eif (superClass) subClass.__proto__ = superClass; }
 
  // Update the hash location, either replacing the current entry, or adding
  // a new one to the browser history.
  function updateHash(location, fragment, replace) {
    if (replace) {
      var href = location.href.replace(/(javascript:|#).*$/, '');
      location.replace(href + '#' + fragment);
    } else {
      // Some browsers require that `hash` contains a leading #.
      location.hash = '#' + fragment;
    }
  }
 
  function configure(aurelia) {
    aurelia.withSingleton(History, BrowserHistory);
  }
 
  return {
    setters: [function (_coreJs) {
      core = _coreJs['default'];
    }, function (_aureliaHistory) {
      History = _aureliaHistory.History;
    }],
    execute: function () {
 
      // Cached regex for stripping a leading hash/slash and trailing space.
      routeStripper = /^#?\/*|\s+$/g;
 
      // Cached regex for stripping leading and trailing slashes.
      rootStripper = /^\/+|\/+$/g;
 
      // Cached regex for detecting MSIE.
      isExplorer = /msie [\w.]+/;
 
      // Cached regex for removing a trailing slash.
      trailingSlash = /\/$/;
 
      // Cached regex for detecting if a URL is absolute,
      // i.e., starts with a scheme or is scheme-relative.
      // See http://www.ietf.org/rfc/rfc2396.txt section 3.1 for valid scheme format
      absoluteUrl = /^([a-z][a-z0-9+\-.]*:)?\/\//i;
 
      BrowserHistory = (function (_History) {
        function BrowserHistory() {
          _classCallCheck(this, BrowserHistory);
 
          _History.call(this);
 
          this.interval = 50;
          this.active = false;
          this.previousFragment = '';
          this._checkUrlCallback = this.checkUrl.bind(this);
 
          Eif (typeof window !== 'undefined') {
            this.location = window.location;
            this.history = window.history;
          }
        }
 
        _inherits(BrowserHistory, _History);
 
        BrowserHistory.prototype.getHash = function getHash(window) {
          var match = (window || this).location.href.match(/#(.*)$/);
          return match ? match[1] : '';
        };
 
        BrowserHistory.prototype.getFragment = function getFragment(fragment, forcePushState) {
          var root;
 
          Iif (!fragment) {
            if (this._hasPushState || !this._wantsHashChange || forcePushState) {
              fragment = this.location.pathname + this.location.search;
              root = this.root.replace(trailingSlash, '');
              if (!fragment.indexOf(root)) {
                fragment = fragment.substr(root.length);
              }
            } else {
              fragment = this.getHash();
            }
          }
 
          return fragment.replace(routeStripper, '');
        };
 
        BrowserHistory.prototype.activate = function activate(options) {
          if (this.active) {
            throw new Error('History has already been activated.');
          }
 
          this.active = true;
 
          // Figure out the initial configuration. Do we need an iframe?
          // Is pushState desired ... is it available?
          this.options = Object.assign({}, { root: '/' }, this.options, options);
          this.root = this.options.root;
          this._wantsHashChange = this.options.hashChange !== false;
          this._wantsPushState = !!this.options.pushState;
          this._hasPushState = !!(this.options.pushState && this.history && this.history.pushState);
 
          var fragment = this.getFragment();
 
          // Normalize root to always include a leading and trailing slash.
          this.root = ('/' + this.root + '/').replace(rootStripper, '/');
 
          // Depending on whether we're using pushState or hashes, and whether
          // 'onhashchange' is supported, determine how we check the URL state.
          if (this._hasPushState) {
            window.onpopstate = this._checkUrlCallback;
          } else if (this._wantsHashChange && 'onhashchange' in window) {
            window.addEventListener('hashchange', this._checkUrlCallback);
          } else if (this._wantsHashChange) {
            this._checkUrlTimer = setTimeout(this._checkUrlCallback, this.interval);
          }
 
          // Determine if we need to change the base url, for a pushState link
          // opened by a non-pushState browser.
          this.fragment = fragment;
 
          var loc = this.location;
          var atRoot = loc.pathname.replace(/[^\/]$/, '$&/') === this.root;
 
          // Transition from hashChange to pushState or vice versa if both are requested.
          if (this._wantsHashChange && this._wantsPushState) {
            // If we've started off with a route from a `pushState`-enabled
            // browser, but we're currently in a browser that doesn't support it...
            if (!this._hasPushState && !atRoot) {
              this.fragment = this.getFragment(null, true);
              this.location.replace(this.root + this.location.search + '#' + this.fragment);
              // Return immediately as browser will do redirect to new url
              return true;
 
              // Or if we've started out with a hash-based route, but we're currently
              // in a browser where it could be `pushState`-based instead...
            } else if (this._hasPushState && atRoot && loc.hash) {
              this.fragment = this.getHash().replace(routeStripper, '');
              this.history.replaceState({}, document.title, this.root + this.fragment + loc.search);
            }
          }
 
          if (!this.options.silent) {
            return this.loadUrl();
          }
        };
 
        BrowserHistory.prototype.deactivate = function deactivate() {
          window.onpopstate = null;
          window.removeEventListener('hashchange', this._checkUrlCallback);
          clearTimeout(this._checkUrlTimer);
          this.active = false;
        };
 
        BrowserHistory.prototype.checkUrl = function checkUrl() {
          var current = this.getFragment();
 
          if (this._checkUrlTimer) {
            clearTimeout(this._checkUrlTimer);
            this._checkUrlTimer = setTimeout(this._checkUrlCallback, this.interval);
          }
 
          if (current === this.fragment && this.iframe) {
            current = this.getFragment(this.getHash(this.iframe));
          }
 
          if (current === this.fragment) {
            return false;
          }
 
          if (this.iframe) {
            this.navigate(current, false);
          }
 
          this.loadUrl();
        };
 
        BrowserHistory.prototype.loadUrl = function loadUrl(fragmentOverride) {
          var fragment = this.fragment = this.getFragment(fragmentOverride);
 
          return this.options.routeHandler ? this.options.routeHandler(fragment) : false;
        };
 
        BrowserHistory.prototype.navigate = function navigate(fragment, options) {
          if (fragment && absoluteUrl.test(fragment)) {
            window.location.href = fragment;
            return true;
          }
 
          if (!this.active) {
            return false;
          }
 
          if (options === undefined) {
            options = {
              trigger: true
            };
          } else if (typeof options === 'boolean') {
            options = {
              trigger: options
            };
          }
 
          fragment = this.getFragment(fragment || '');
 
          if (this.fragment === fragment) {
            return;
          }
 
          this.fragment = fragment;
 
          var url = this.root + fragment;
 
          // Don't include a trailing slash on the root.
          if (fragment === '' && url !== '/') {
            url = url.slice(0, -1);
          }
 
          // If pushState is available, we use it to set the fragment as a real URL.
          if (this._hasPushState) {
            this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);
 
            // If hash changes haven't been explicitly disabled, update the hash
            // fragment to store history.
          } else if (this._wantsHashChange) {
            updateHash(this.location, fragment, options.replace);
 
            if (this.iframe && fragment !== this.getFragment(this.getHash(this.iframe))) {
              // Opening and closing the iframe tricks IE7 and earlier to push a
              // history entry on hash-tag change.  When replace is true, we don't
              // want history.
              if (!options.replace) {
                this.iframe.document.open().close();
              }
 
              updateHash(this.iframe.location, fragment, options.replace);
            }
 
            // If you've told us that you explicitly don't want fallback hashchange-
            // based history, then `navigate` becomes a page refresh.
          } else {
            return this.location.assign(url);
          }
 
          if (options.trigger) {
            return this.loadUrl(fragment);
          } else {
            this.previousFragment = fragment;
          }
        };
 
        BrowserHistory.prototype.navigateBack = function navigateBack() {
          this.history.back();
        };
 
        return BrowserHistory;
      })(History);
 
      _export('BrowserHistory', BrowserHistory);
    }
  };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL2hpc3RvcnktYnJvd3Nlci9zcmMvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O3FCQUlJLGFBQWEsRUFHYixZQUFZLEVBR1osVUFBVSxFQUdWLGFBQWEsRUFLWCxXQUFXLEVBY0osY0FBYzs7dUJBaU5YLFNBQVM7Ozs7Ozs7O0FBM056QixXQUFTLFVBQVUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtBQUMvQyxRQUFJLE9BQU8sRUFBRTtBQUNYLFVBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzNELGNBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQztLQUN6QyxNQUFNOztBQUVMLGNBQVEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQztLQUNoQztHQUNGOztBQW1OTSxXQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUM7QUFDaEMsV0FBTyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7R0FDaEQ7Ozs7OztnQ0FsUE8sT0FBTzs7Ozs7QUFHWCxtQkFBYSxHQUFHLGNBQWM7OztBQUc5QixrQkFBWSxHQUFHLFlBQVk7OztBQUczQixnQkFBVSxHQUFHLGFBQWE7OztBQUcxQixtQkFBYSxHQUFHLEtBQUs7Ozs7O0FBS25CLGlCQUFXLEdBQUcsOEJBQThCOztBQWNyQyxvQkFBYztBQUNkLGlCQURBLGNBQWMsR0FDWjtnQ0FERixjQUFjOztBQUV2Qiw2QkFBTyxDQUFDOztBQUVSLGNBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ25CLGNBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0FBQ3BCLGNBQUksQ0FBQyxnQkFBZ0Is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TUFBTTtBQUNMLG1CQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1dBQ2xDOztBQUVELGNBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtBQUNuQixtQkFBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1dBQy9CLE1BQU07QUFDTCxnQkFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztXQUNsQztTQUNGOztBQTFNVSxzQkFBYyxXQTRNekIsWUFBWSxHQUFBLHdCQUFHO0FBQ2IsY0FBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNyQjs7ZUE5TVUsY0FBYztTQUFTLE9BQU87O2dDQUE5QixjQUFjIiwiZmlsZSI6Ii9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL2hpc3RvcnktYnJvd3Nlci9zcmMvaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29yZSBmcm9tICdjb3JlLWpzJztcbmltcG9ydCB7SGlzdG9yeX0gZnJvbSAnYXVyZWxpYS1oaXN0b3J5JztcblxuLy8gQ2FjaGVkIHJlZ2V4IGZvciBzdHJpcHBpbmcgYSBsZWFkaW5nIGhhc2gvc2xhc2ggYW5kIHRyYWlsaW5nIHNwYWNlLlxudmFyIHJvdXRlU3RyaXBwZXIgPSAvXiM/XFwvKnxcXHMrJC9nO1xuXG4vLyBDYWNoZWQgcmVnZXggZm9yIHN0cmlwcGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzLlxudmFyIHJvb3RTdHJpcHBlciA9IC9eXFwvK3xcXC8rJC9nO1xuXG4vLyBDYWNoZWQgcmVnZXggZm9yIGRldGVjdGluZyBNU0lFLlxudmFyIGlzRXhwbG9yZXIgPSAvbXNpZSBbXFx3Ll0rLztcblxuLy8gQ2FjaGVkIHJlZ2V4IGZvciByZW1vdmluZyBhIHRyYWlsaW5nIHNsYXNoLlxudmFyIHRyYWlsaW5nU2xhc2ggPSAvXFwvJC87XG5cbi8vIENhY2hlZCByZWdleCBmb3IgZGV0ZWN0aW5nIGlmIGEgVVJMIGlzIGFic29sdXRlLFxuLy8gaS5lLiwgc3RhcnRzIHdpdGggYSBzY2hlbWUgb3IgaXMgc2NoZW1lLXJlbGF0aXZlLlxuLy8gU2VlIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0IHNlY3Rpb24gMy4xIGZvciB2YWxpZCBzY2hlbWUgZm9ybWF0XG5jb25zdCBhYnNvbHV0ZVVybCA9IC9eKFthLXpdW2EtejAtOStcXC0uXSo6KT9cXC9cXC8vaTtcblxuLy8gVXBkYXRlIHRoZSBoYXNoIGxvY2F0aW9uLCBlaXRoZXIgcmVwbGFjaW5nIHRoZSBjdXJyZW50IGVudHJ5LCBvciBhZGRpbmdcbi8vIGEgbmV3IG9uZSB0byB0aGUgYnJvd3NlciBoaXN0b3J5LlxuZnVuY3Rpb24gdXBkYXRlSGFzaChsb2NhdGlvbiwgZnJhZ21lbnQsIHJlcGxhY2UpIHtcbiAgaWYgKHJlcGxhY2UpIHtcbiAgICB2YXIgaHJlZiA9IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvKGphdmFzY3JpcHQ6fCMpLiokLywgJycpO1xuICAgIGxvY2F0aW9uLnJlcGxhY2UoaHJlZiArICcjJyArIGZyYWdtZW50KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBTb21lIGJyb3dzZXJzIHJlcXVpcmUgdGhhdCBgaGFzaGAgY29udGFpbnMgYSBsZWFkaW5nICMuXG4gICAgbG9jYXRpb24uaGFzaCA9ICcjJyArIGZyYWdtZW50O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCcm93c2VySGlzdG9yeSBleHRlbmRzIEhpc3Rvcnkge1xuICBjb25zdHJ1Y3Rvcigpe1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmludGVydmFsID0gNTA7XG4gICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLnByZXZpb3VzRnJhZ21lbnQgPSAnJztcbiAgICB0aGlzLl9jaGVja1VybENhbGxiYWNrID0gdGhpcy5jaGVja1VybC5iaW5kKHRoaXMpO1xuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuICAgICAgdGhpcy5oaXN0b3J5ID0gd2luZG93Lmhpc3Rvcnk7XG4gICAgfVxuICB9XG5cbiAgZ2V0SGFzaCh3aW5kb3cpe1xuICAgIHZhciBtYXRjaCA9ICh3aW5kb3cgfHwgdGhpcykubG9jYXRpb24uaHJlZi5tYXRjaCgvIyguKikkLyk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiAnJztcbiAgfVxuXG4gIGdldEZyYWdtZW50KGZyYWdtZW50LCBmb3JjZVB1c2hTdGF0ZSkge1xuICAgIHZhciByb290O1xuXG4gICAgaWYgKCFmcmFnbWVudCkge1xuICAgICAgaWYgKHRoaXMuX2hhc1B1c2hTdGF0ZSB8fCAhdGhpcy5fd2FudHNIYXNoQ2hhbmdlIHx8IGZvcmNlUHVzaFN0YXRlKSB7XG4gICAgICAgIGZyYWdtZW50ID0gdGhpcy5sb2NhdGlvbi5wYXRobmFtZSArIHRoaXMubG9jYXRpb24uc2VhcmNoO1xuICAgICAgICByb290ID0gdGhpcy5yb290LnJlcGxhY2UodHJhaWxpbmdTbGFzaCwgJycpO1xuICAgICAgICBpZiAoIWZyYWdtZW50LmluZGV4T2Yocm9vdCkpIHtcbiAgICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50LnN1YnN0cihyb290Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZXRIYXNoKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyYWdtZW50LnJlcGxhY2Uocm91dGVTdHJpcHBlciwgJycpO1xuICB9XG5cbiAgYWN0aXZhdGUob3B0aW9ucykge1xuICAgIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGlzdG9yeSBoYXMgYWxyZWFkeSBiZWVuIGFjdGl2YXRlZC5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuXG4gICAgLy8gRmlndXJlIG91dCB0aGUgaW5pdGlhbCBjb25maWd1cmF0aW9uLiBEbyB3ZSBuZWVkIGFuIGlmcmFtZT9cbiAgICAvLyBJcyBwdXNoU3RhdGUgZGVzaXJlZCAuLi4gaXMgaXQgYXZhaWxhYmxlP1xuICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHsgcm9vdDogJy8nIH0sIHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgdGhpcy5yb290ID0gdGhpcy5vcHRpb25zLnJvb3Q7XG4gICAgdGhpcy5fd2FudHNIYXNoQ2hhbmdlID0gdGhpcy5vcHRpb25zLmhhc2hDaGFuZ2UgIT09IGZhbHNlO1xuICAgIHRoaXMuX3dhbnRzUHVzaFN0YXRlID0gISF0aGlzLm9wdGlvbnMucHVzaFN0YXRlO1xuICAgIHRoaXMuX2hhc1B1c2hTdGF0ZSA9ICEhKHRoaXMub3B0aW9ucy5wdXNoU3RhdGUgJiYgdGhpcy5oaXN0b3J5ICYmIHRoaXMuaGlzdG9yeS5wdXNoU3RhdGUpO1xuXG4gICAgdmFyIGZyYWdtZW50ID0gdGhpcy5nZXRGcmFnbWVudCgpO1xuXG4gICAgLy8gTm9ybWFsaXplIHJvb3QgdG8gYWx3YXlzIGluY2x1ZGUgYSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaC5cbiAgICB0aGlzLnJvb3QgPSAoJy8nICsgdGhpcy5yb290ICsgJy8nKS5yZXBsYWNlKHJvb3RTdHJpcHBlciwgJy8nKTtcblxuICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHdlJ3JlIHVzaW5nIHB1c2hTdGF0ZSBvciBoYXNoZXMsIGFuZCB3aGV0aGVyXG4gICAgLy8gJ29uaGFzaGNoYW5nZScgaXMgc3VwcG9ydGVkLCBkZXRlcm1pbmUgaG93IHdlIGNoZWNrIHRoZSBVUkwgc3RhdGUuXG4gICAgaWYgKHRoaXMuX2hhc1B1c2hTdGF0ZSkge1xuICAgICAgd2luZG93Lm9ucG9wc3RhdGUgPSB0aGlzLl9jaGVja1VybENhbGxiYWNrO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fd2FudHNIYXNoQ2hhbmdlICYmICgnb25oYXNoY2hhbmdlJyBpbiB3aW5kb3cpKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRoaXMuX2NoZWNrVXJsQ2FsbGJhY2spO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fd2FudHNIYXNoQ2hhbmdlKSB7XG4gICAgICB0aGlzLl9jaGVja1VybFRpbWVyID0gc2V0VGltZW91dCh0aGlzLl9jaGVja1VybENhbGxiYWNrLCB0aGlzLmludGVydmFsKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGJhc2UgdXJsLCBmb3IgYSBwdXNoU3RhdGUgbGlua1xuICAgIC8vIG9wZW5lZCBieSBhIG5vbi1wdXNoU3RhdGUgYnJvd3Nlci5cbiAgICB0aGlzLmZyYWdtZW50ID0gZnJhZ21lbnQ7XG5cbiAgICB2YXIgbG9jID0gdGhpcy5sb2NhdGlvbjtcbiAgICB2YXIgYXRSb290ID0gbG9jLnBhdGhuYW1lLnJlcGxhY2UoL1teXFwvXSQvLCAnJCYvJykgPT09IHRoaXMucm9vdDtcblxuICAgIC8vIFRyYW5zaXRpb24gZnJvbSBoYXNoQ2hhbmdlIHRvIHB1c2hTdGF0ZSBvciB2aWNlIHZlcnNhIGlmIGJvdGggYXJlIHJlcXVlc3RlZC5cbiAgICBpZiAodGhpcy5fd2FudHNIYXNoQ2hhbmdlICYmIHRoaXMuX3dhbnRzUHVzaFN0YXRlKSB7XG4gICAgICAvLyBJZiB3ZSd2ZSBzdGFydGVkIG9mZiB3aXRoIGEgcm91dGUgZnJvbSBhIGBwdXNoU3RhdGVgLWVuYWJsZWRcbiAgICAgIC8vIGJyb3dzZXIsIGJ1dCB3ZSdyZSBjdXJyZW50bHkgaW4gYSBicm93c2VyIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0Li4uXG4gICAgICBpZiAoIXRoaXMuX2hhc1B1c2hTdGF0ZSAmJiAhYXRSb290KSB7XG4gICAgICAgIHRoaXMuZnJhZ21lbnQgPSB0aGlzLmdldEZyYWdtZW50KG51bGwsIHRydWUpO1xuICAgICAgICB0aGlzLmxvY2F0aW9uLnJlcGxhY2UodGhpcy5yb290ICsgdGhpcy5sb2NhdGlvbi5zZWFyY2ggKyAnIycgKyB0aGlzLmZyYWdtZW50KTtcbiAgICAgICAgLy8gUmV0dXJuIGltbWVkaWF0ZWx5IGFzIGJyb3dzZXIgd2lsbCBkbyByZWRpcmVjdCB0byBuZXcgdXJsXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIE9yIGlmIHdlJ3ZlIHN0YXJ0ZWQgb3V0IHdpdGggYSBoYXNoLWJhc2VkIHJvdXRlLCBidXQgd2UncmUgY3VycmVudGx5XG4gICAgICAgIC8vIGluIGEgYnJvd3NlciB3aGVyZSBpdCBjb3VsZCBiZSBgcHVzaFN0YXRlYC1iYXNlZCBpbnN0ZWFkLi4uXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2hhc1B1c2hTdGF0ZSAmJiBhdFJvb3QgJiYgbG9jLmhhc2gpIHtcbiAgICAgICAgdGhpcy5mcmFnbWVudCA9IHRoaXMuZ2V0SGFzaCgpLnJlcGxhY2Uocm91dGVTdHJpcHBlciwgJycpO1xuICAgICAgICB0aGlzLmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBkb2N1bWVudC50aXRsZSwgdGhpcy5yb290ICsgdGhpcy5mcmFnbWVudCArIGxvYy5zZWFyY2gpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZFVybCgpO1xuICAgIH1cbiAgfVxuXG4gIGRlYWN0aXZhdGUoKSB7XG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSBudWxsO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgdGhpcy5fY2hlY2tVcmxDYWxsYmFjayk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2NoZWNrVXJsVGltZXIpO1xuICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gIH1cblxuICBjaGVja1VybCgpIHtcbiAgICB2YXIgY3VycmVudCA9IHRoaXMuZ2V0RnJhZ21lbnQoKTtcblxuICAgIGlmICh0aGlzLl9jaGVja1VybFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jaGVja1VybFRpbWVyKTtcbiAgICAgICAgdGhpcy5fY2hlY2tVcmxUaW1lciA9IHNldFRpbWVvdXQodGhpcy5fY2hlY2tVcmxDYWxsYmFjaywgdGhpcy5pbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQgPT09IHRoaXMuZnJhZ21lbnQgJiYgdGhpcy5pZnJhbWUpIHtcbiAgICAgIGN1cnJlbnQgPSB0aGlzLmdldEZyYWdtZW50KHRoaXMuZ2V0SGFzaCh0aGlzLmlmcmFtZSkpO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50ID09PSB0aGlzLmZyYWdtZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaWZyYW1lKSB7XG4gICAgICB0aGlzLm5hdmlnYXRlKGN1cnJlbnQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRVcmwoKTtcbiAgfVxuXG4gIGxvYWRVcmwoZnJhZ21lbnRPdmVycmlkZSkge1xuICAgIHZhciBmcmFnbWVudCA9IHRoaXMuZnJhZ21lbnQgPSB0aGlzLmdldEZyYWdtZW50KGZyYWdtZW50T3ZlcnJpZGUpO1xuXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yb3V0ZUhhbmRsZXIgP1xuICAgICAgdGhpcy5vcHRpb25zLnJvdXRlSGFuZGxlcihmcmFnbWVudCkgOlxuICAgICAgZmFsc2U7XG4gIH1cblxuICBuYXZpZ2F0ZShmcmFnbWVudCwgb3B0aW9ucykge1xuICAgIGlmIChmcmFnbWVudCAmJiBhYnNvbHV0ZVVybC50ZXN0KGZyYWdtZW50KSkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBmcmFnbWVudDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5hY3RpdmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICB0cmlnZ2VyOiB0cnVlXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICB0cmlnZ2VyOiBvcHRpb25zXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZyYWdtZW50ID0gdGhpcy5nZXRGcmFnbWVudChmcmFnbWVudCB8fCAnJyk7XG5cbiAgICBpZiAodGhpcy5mcmFnbWVudCA9PT0gZnJhZ21lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZyYWdtZW50ID0gZnJhZ21lbnQ7XG5cbiAgICB2YXIgdXJsID0gdGhpcy5yb290ICsgZnJhZ21lbnQ7XG5cbiAgICAvLyBEb24ndCBpbmNsdWRlIGEgdHJhaWxpbmcgc2xhc2ggb24gdGhlIHJvb3QuXG4gICAgaWYgKGZyYWdtZW50ID09PSAnJyAmJiB1cmwgIT09ICcvJykge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIC0xKTtcbiAgICB9XG5cbiAgICAvLyBJZiBwdXNoU3RhdGUgaXMgYXZhaWxhYmxlLCB3ZSB1c2UgaXQgdG8gc2V0IHRoZSBmcmFnbWVudCBhcyBhIHJlYWwgVVJMLlxuICAgIGlmICh0aGlzLl9oYXNQdXNoU3RhdGUpIHtcbiAgICAgIHRoaXMuaGlzdG9yeVtvcHRpb25zLnJlcGxhY2UgPyAncmVwbGFjZVN0YXRlJyA6ICdwdXNoU3RhdGUnXSh7fSwgZG9jdW1lbnQudGl0bGUsIHVybCk7XG5cbiAgICAgIC8vIElmIGhhc2ggY2hhbmdlcyBoYXZlbid0IGJlZW4gZXhwbGljaXRseSBkaXNhYmxlZCwgdXBkYXRlIHRoZSBoYXNoXG4gICAgICAvLyBmcmFnbWVudCB0byBzdG9yZSBoaXN0b3J5LlxuICAgIH0gZWxzZSBpZiAodGhpcy5fd2FudHNIYXNoQ2hhbmdlKSB7XG4gICAgICB1cGRhdGVIYXNoKHRoaXMubG9jYXRpb24sIGZyYWdtZW50LCBvcHRpb25zLnJlcGxhY2UpO1xuXG4gICAgICBpZiAodGhpcy5pZnJhbWUgJiYgKGZyYWdtZW50ICE9PSB0aGlzLmdldEZyYWdtZW50KHRoaXMuZ2V0SGFzaCh0aGlzLmlmcmFtZSkpKSkge1xuICAgICAgICAvLyBPcGVuaW5nIGFuZCBjbG9zaW5nIHRoZSBpZnJhbWUgdHJpY2tzIElFNyBhbmQgZWFybGllciB0byBwdXNoIGFcbiAgICAgICAgLy8gaGlzdG9yeSBlbnRyeSBvbiBoYXNoLXRhZyBjaGFuZ2UuICBXaGVuIHJlcGxhY2UgaXMgdHJ1ZSwgd2UgZG9uJ3RcbiAgICAgICAgLy8gd2FudCBoaXN0b3J5LlxuICAgICAgICBpZiAoIW9wdGlvbnMucmVwbGFjZSkge1xuICAgICAgICAgICAgdGhpcy5pZnJhbWUuZG9jdW1lbnQub3BlbigpLmNsb3NlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVIYXNoKHRoaXMuaWZyYW1lLmxvY2F0aW9uLCBmcmFnbWVudCwgb3B0aW9ucy5yZXBsYWNlKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgeW91J3ZlIHRvbGQgdXMgdGhhdCB5b3UgZXhwbGljaXRseSBkb24ndCB3YW50IGZhbGxiYWNrIGhhc2hjaGFuZ2UtXG4gICAgICAvLyBiYXNlZCBoaXN0b3J5LCB0aGVuIGBuYXZpZ2F0ZWAgYmVjb21lcyBhIHBhZ2UgcmVmcmVzaC5cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb24uYXNzaWduKHVybCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudHJpZ2dlcikge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZFVybChmcmFnbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJldmlvdXNGcmFnbWVudCA9IGZyYWdtZW50O1xuICAgIH1cbiAgfVxuXG4gIG5hdmlnYXRlQmFjaygpIHtcbiAgICB0aGlzLmhpc3RvcnkuYmFjaygpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmUoYXVyZWxpYSl7XG4gIGF1cmVsaWEud2l0aFNpbmdsZXRvbihIaXN0b3J5LCBCcm93c2VySGlzdG9yeSk7XG59XG4iXX0=